Pandas 데이터 입출력

이 노트북의 예제를 실행하기 위해서는 datascienceschool/rpython 도커 이미지의 다음 디렉토리로 이동해야 한다.


In [2]:
%cd /home/dockeruser/data/pydata-book-master/


/home/dockeruser/data/pydata-book-master

pandas 데이터 입출력 종류

  • CSV
  • Clipboard
  • Excel
  • JSON
  • HTML
  • Python Pickling
  • HDF5
  • SAS
  • STATA
  • SQL
  • Google BigQuery

CSV 파일 입력

  • Comma Separated Values
  • MicroSoft EXCEL에서 export 가능
  • pandas.from_csv(): csv file -> DataFrame

In [1]:
!cat ../../pydata-book-master/ch06/ex1.csv


'cat'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는
배치 파일이 아닙니다.

In [3]:
!cat ch06/ex1.csv


a,b,c,d,message
1,2,3,4,hello
5,6,7,8,world
9,10,11,12,foo

In [2]:
df = pd.read_csv('../../pydata-book-master/ch06/ex1.csv')
df


Out[2]:
a b c d message
0 1 2 3 4 hello
1 5 6 7 8 world
2 9 10 11 12 foo
  • 컬럼 이름이 없는 경우에는 names 인수로 설정 가능

In [5]:
!cat ch06/ex2.csv


1,2,3,4,hello
5,6,7,8,world
9,10,11,12,foo

In [3]:
pd.read_csv('../../pydata-book-master/ch06/ex2.csv', names=['a', 'b', 'c', 'd', 'message'])


Out[3]:
a b c d message
0 1 2 3 4 hello
1 5 6 7 8 world
2 9 10 11 12 foo
  • 특정한 컬럼을 인덱스로 지정하고 싶으면 index_col 인수 사용

In [7]:
!cat ch06/csv_mindex.csv


key1,key2,value1,value2
one,a,1,2
one,b,3,4
one,c,5,6
one,d,7,8
two,a,9,10
two,b,11,12
two,c,13,14
two,d,15,16

In [6]:
pd.read_csv('../../pydata-book-master/ch06/csv_mindex.csv', index_col=['key1', 'key2'])


Out[6]:
value1 value2
key1 key2
one a 1 2
b 3 4
c 5 6
d 7 8
two a 9 10
b 11 12
c 13 14
d 15 16
  • 구분자가 comma가 아닌 경우에는 sep 인수 사용

In [9]:
!cat 'ch06/ex3.txt'


            A         B         C
aaa -0.264438 -1.026059 -0.619500
bbb  0.927272  0.302904 -0.032399
ccc -0.264273 -0.386314 -0.217601
ddd -0.871858 -0.348382  1.100491

In [12]:
pd.read_table('../../pydata-book-master/ch06/ex3.txt', sep='\s+')


Out[12]:
A B C
aaa -0.264438 -1.026059 -0.619500
bbb 0.927272 0.302904 -0.032399
ccc -0.264273 -0.386314 -0.217601
ddd -0.871858 -0.348382 1.100491
  • 건너 뛰어야 할 행이 있으면 skiprows 사용

In [11]:
!cat ch06/ex4.csv


# hey!
a,b,c,d,message
# just wanted to make things more difficult for you
# who reads CSV files with computers, anyway?
1,2,3,4,hello
5,6,7,8,world
9,10,11,12,foo

In [15]:
pd.read_csv('../../pydata-book-master/ch06/ex4.csv', skiprows=[0, 2, 3])


Out[15]:
a b c d message
0 1 2 3 4 hello
1 5 6 7 8 world
2 9 10 11 12 foo
  • 특정한 값을 NA로 취급하고 싶으면 na_values 인수 사용

In [13]:
!cat ch06/ex5.csv


something,a,b,c,d,message
one,1,2,3,4,NA
two,5,6,,8,world
three,9,10,11,12,foo

In [16]:
sentinels = {'message': ['foo', 'NA'], 'something': ['two']}
pd.read_csv('../../pydata-book-master/ch06/ex5.csv', na_values=sentinels)


Out[16]:
something a b c d message
0 one 1 2 3.0 4 NaN
1 NaN 5 6 NaN 8 world
2 three 9 10 11.0 12 NaN
  • 일부 행만 읽고 싶다면 nrows 인수 사용

In [20]:
!head ch06/ex6.csv


one,two,three,four,key
0.467976300189,-0.0386485396255,-0.295344251987,-1.82472622729,L
-0.358893469543,1.40445260007,0.704964644926,-0.200638304015,B
-0.50184039929,0.659253707223,-0.421690619312,-0.0576883018364,G
0.204886212202,1.07413396504,1.38836131252,-0.982404023494,R
0.354627914484,-0.133115852296,0.283762637978,-0.837062961653,Q
1.81748001608,0.742272722638,0.419394843928,-2.25103520513,Q
-0.776764319165,0.935517747061,-0.332871759623,-1.87564085416,U
-0.913134961617,1.53062351168,-0.572656719239,0.477252252981,K
0.358479538224,-0.49757199147,-0.367016188009,0.507701778685,S

In [20]:
pd.read_csv('../../pydata-book-master/ch06/ex6.csv', nrows=3)


Out[20]:
one two three four key
0 0.467976 -0.038649 -0.295344 -1.824726 L
1 -0.358893 1.404453 0.704965 -0.200638 B
2 -0.501840 0.659254 -0.421691 -0.057688 G

CSV 파일 출력

  • DataFrame.to_csv(): DataFrame -> csv file

In [21]:
df.to_csv('../../pydata-book-master/ch06/out.csv')

In [22]:
!cat ch06/out.csv


,a,b,c,d,message
0,1,2,3,4,hello
1,5,6,7,8,world
2,9,10,11,12,foo
  • sep 인수로 구분자 변경 가능

In [25]:
import sys
df.to_csv(sys.stdout, sep='|')


|a|b|c|d|message
0|1|2|3|4|hello
1|5|6|7|8|world
2|9|10|11|12|foo
  • na_rep 인수로 NA 표시 변경 가능

In [26]:
df.to_csv(sys.stdout, na_rep='NULL')


,a,b,c,d,message
0,1,2,3,4,hello
1,5,6,7,8,world
2,9,10,11,12,foo
  • index, header 인수로 인덱스 및 헤더 출력 여부 결정 가능

In [27]:
df.to_csv(sys.stdout, index=False, header=False)


1,2,3,4,hello
5,6,7,8,world
9,10,11,12,foo

인터넷 상의 CSV 파일 입력

  • 파일 path 대신 URL을 지정하면 다운로드하여 import

In [28]:
titanic = pd.read_csv('http://dato.com/files/titanic.csv', index_col=0)
titanic.tail()


Out[28]:
Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
PassengerId
887 0 2 Montvila, Rev. Juozas male 27.0 0 0 211536 13.00 NaN S
888 1 1 Graham, Miss. Margaret Edith female 19.0 0 0 112053 30.00 B42 S
889 0 3 Johnston, Miss. Catherine Helen "Carrie" female NaN 1 2 W./C. 6607 23.45 NaN S
890 1 1 Behr, Mr. Karl Howell male 26.0 0 0 111369 30.00 C148 C
891 0 3 Dooley, Mr. Patrick male 32.0 0 0 370376 7.75 NaN Q

인터넷 상의 데이터 베이스 자료 입력

다음과 같은 인터넷 상의 자료는 pandas_datareader 패키지의 DataReader 을 써서 바로 pandas로 입력 가능

  • Yahoo! Finance
  • Google Finance
  • St.Louis FED (FRED)
  • Kenneth French’s data library
  • World Bank
  • Google Analytics

In [1]:
import pandas_datareader.data as web

In [2]:
import datetime
start = datetime.datetime(2015, 1, 1)
end = datetime.datetime(2016, 8, 25)

In [3]:
df = web.DataReader("005930.KS", 'yahoo', start, end)
df.tail()


Out[3]:
Open High Low Close Volume Adj Close
Date
2016-08-18 1567000.0 1644000.0 1566000.0 1640000.0 366500 1640000.0
2016-08-19 1638000.0 1675000.0 1636000.0 1675000.0 336100 1675000.0
2016-08-22 1674000.0 1692000.0 1659000.0 1665000.0 252200 1665000.0
2016-08-23 1665000.0 1694000.0 1657000.0 1687000.0 230900 1687000.0
2016-08-24 1680000.0 1682000.0 1636000.0 1653000.0 318700 1653000.0

In [4]:
df = web.DataReader("KRX:005930", "google", start, end)
df.tail()


Out[4]:
Open High Low Close Volume
Date
2016-08-18 1567000.0 1644000.0 1566000.0 1640000.0 356783
2016-08-19 1638000.0 1675000.0 1636000.0 1675000.0 305169
2016-08-22 1674000.0 1692000.0 1659000.0 1665000.0 251660
2016-08-23 1665000.0 1694000.0 1657000.0 1687000.0 218436
2016-08-24 1680000.0 1682000.0 1636000.0 1653000.0 317292

In [5]:
gdp = web.DataReader("GDP", "fred", start, end)
gdp


Out[5]:
GDP
DATE
2015-01-01 17783.6
2015-04-01 17998.3
2015-07-01 18141.9
2015-10-01 18222.8
2016-01-01 18281.6
2016-04-01 18437.6

In [6]:
inflation = web.DataReader(["CPIAUCSL", "CPILFESL"], "fred", start, end)
inflation


Out[6]:
CPIAUCSL CPILFESL
DATE
2015-01-01 234.954 239.915
2015-02-01 235.415 240.304
2015-03-01 235.859 240.797
2015-04-01 236.197 241.392
2015-05-01 236.876 241.672
2015-06-01 237.423 242.089
2015-07-01 237.734 242.464
2015-08-01 237.703 242.753
2015-09-01 237.489 243.224
2015-10-01 237.949 243.701
2015-11-01 238.302 244.139
2015-12-01 238.041 244.516
2016-01-01 238.107 245.232
2016-02-01 237.707 245.925
2016-03-01 237.920 246.095
2016-04-01 238.890 246.574
2016-05-01 239.410 247.074
2016-06-01 239.927 247.495
2016-07-01 239.828 247.713